package com.kinyx.framework.enums;

import java.util.Locale;

import org.junit.Assert;
import org.junit.Test;

import com.kinyx.framework.enums.impl.IGX;
import com.kinyx.framework.enums.impl.IGZ;
import com.kinyx.framework.enums.impl.IXX;
import com.kinyx.framework.enums.impl.IXZ;
import com.kinyx.framework.enums.impl.XGX0;
import com.kinyx.framework.enums.impl.XGX1;
import com.kinyx.framework.enums.impl.XGX2;
import com.kinyx.framework.enums.impl.XGZ0;
import com.kinyx.framework.enums.impl.XGZ1;
import com.kinyx.framework.enums.impl.XGZ2;
import com.kinyx.framework.enums.impl.XXX0;
import com.kinyx.framework.enums.impl.XXX1;
import com.kinyx.framework.enums.impl.XXX2;
import com.kinyx.framework.enums.impl.XXZ0;
import com.kinyx.framework.enums.impl.XXZ1;
import com.kinyx.framework.enums.impl.XXZ2;

public class I18NEnum_Tester {

	// =================================================== 忽略国际化 =================================================== //

	// 指定了需要忽略国际化，只对中文特殊处理，其它情况都将调用getValue()方法取值。
	@Test
	public void test10() {
		// 该类指定了需要忽略国际化
		Assert.assertEquals("FOO BAR", IXX.FOO_BAR.getValue(null));// 等效于Locale.SIMPLIFIED_CHINESE。// 调用getValue方法取值。
		Assert.assertEquals("FOO BAR", IXX.FOO_BAR.getValue(Locale.SIMPLIFIED_CHINESE));// 调用getValue方法取值。
		Assert.assertEquals("FOO BAR", IXX.FOO_BAR.getValue(Locale.CHINESE));// 调用getValue方法取值。
		Assert.assertEquals("FOO BAR", IXX.FOO_BAR.getValue(Locale.CANADA_FRENCH));// 调用getValue方法取值。
		Assert.assertEquals("FOO BAR", IXX.FOO_BAR.getValue(Locale.FRENCH));// 调用getValue方法取值。

		// 该类指定了需要忽略国际化
		// 该枚举类重写了getValue()方法
		Assert.assertEquals("FOO AND BAR", IGX.FOO_BAR.getValue(null));// 等效于Locale.SIMPLIFIED_CHINESE。// 调用getValue方法取值。
		Assert.assertEquals("FOO AND BAR", IGX.FOO_BAR.getValue(Locale.SIMPLIFIED_CHINESE));// 调用getValue方法取值。
		Assert.assertEquals("FOO AND BAR", IGX.FOO_BAR.getValue(Locale.CHINESE));// 调用getValue方法取值。
		Assert.assertEquals("FOO AND BAR", IGX.FOO_BAR.getValue(Locale.CANADA_FRENCH));// 调用getValue方法取值。
		Assert.assertEquals("FOO AND BAR", IGX.FOO_BAR.getValue(Locale.FRENCH));// 调用getValue方法取值。

		// 该类指定了需要忽略国际化
		// 该类实现了接口IEnum_zh_CN
		Assert.assertEquals("张三和李四", IXZ.FOO_BAR.getValue(null));// 等效于Locale.SIMPLIFIED_CHINESE。// 接口精确匹配，从实现中取。
		Assert.assertEquals("张三和李四", IXZ.FOO_BAR.getValue(Locale.SIMPLIFIED_CHINESE));// 接口精确匹配，从实现中取。
		Assert.assertEquals("张三和李四", IXZ.FOO_BAR.getValue(Locale.CHINESE));// 接口模糊匹配，从实现中取。
		Assert.assertEquals("FOO BAR", IXZ.FOO_BAR.getValue(Locale.CANADA_FRENCH));// 其它语言，调用getValue方法取值。
		Assert.assertEquals("FOO BAR", IXZ.FOO_BAR.getValue(Locale.FRENCH));// 其它语言，调用getValue方法取值。

		// 该类指定了需要忽略国际化
		// 该类实现了接口IEnum_zh_CN
		// 该枚举类重写了getValue()方法
		Assert.assertEquals("张三和李四", IGZ.FOO_BAR.getValue(null));// 等效于Locale.SIMPLIFIED_CHINESE。// 接口精确匹配，从实现中取。
		Assert.assertEquals("张三和李四", IGZ.FOO_BAR.getValue(Locale.SIMPLIFIED_CHINESE));// 接口精确匹配，从实现中取。
		Assert.assertEquals("张三和李四", IGZ.FOO_BAR.getValue(Locale.CHINESE));// 接口模糊匹配，从实现中取。
		Assert.assertEquals("FOO AND BAR", IGZ.FOO_BAR.getValue(Locale.CANADA_FRENCH));// 其它语言，调用getValue方法取值。
		Assert.assertEquals("FOO AND BAR", IGZ.FOO_BAR.getValue(Locale.FRENCH));// 其它语言，调用getValue方法取值。
	}

	// =================================================== 不忽略国际化 =================================================== //
	// 无国际化配置文件的情况，执行结果与忽略国际化保持一致。
	@Test
	public void test11() {
		Assert.assertEquals("FOO BAR", XXX0.FOO_BAR.getValue(null));// 等效于Locale.SIMPLIFIED_CHINESE。// 调用getValue方法取值。
		Assert.assertEquals("FOO BAR", XXX0.FOO_BAR.getValue(Locale.SIMPLIFIED_CHINESE));// 调用getValue方法取值。
		Assert.assertEquals("FOO BAR", XXX0.FOO_BAR.getValue(Locale.CHINESE));// 调用getValue方法取值。
		Assert.assertEquals("FOO BAR", XXX0.FOO_BAR.getValue(Locale.CANADA_FRENCH));// 调用getValue方法取值。
		Assert.assertEquals("FOO BAR", XXX0.FOO_BAR.getValue(Locale.FRENCH));// 调用getValue方法取值。

		// 该枚举类重写了getValue()方法
		Assert.assertEquals("FOO AND BAR", XGX0.FOO_BAR.getValue(null));// 等效于Locale.SIMPLIFIED_CHINESE。// 调用getValue方法取值。
		Assert.assertEquals("FOO AND BAR", XGX0.FOO_BAR.getValue(Locale.SIMPLIFIED_CHINESE));// 调用getValue方法取值。
		Assert.assertEquals("FOO AND BAR", XGX0.FOO_BAR.getValue(Locale.CHINESE));// 调用getValue方法取值。
		Assert.assertEquals("FOO AND BAR", XGX0.FOO_BAR.getValue(Locale.CANADA_FRENCH));// 调用getValue方法取值。
		Assert.assertEquals("FOO AND BAR", XGX0.FOO_BAR.getValue(Locale.FRENCH));// 调用getValue方法取值。

		// 该类实现了接口IEnum_zh_CN
		Assert.assertEquals("张三和李四", XXZ0.FOO_BAR.getValue(null));// 等效于Locale.SIMPLIFIED_CHINESE。// 接口精确匹配，从实现中取。
		Assert.assertEquals("张三和李四", XXZ0.FOO_BAR.getValue(Locale.SIMPLIFIED_CHINESE));// 接口精确匹配，从实现中取。
		Assert.assertEquals("张三和李四", XXZ0.FOO_BAR.getValue(Locale.CHINESE));// 接口模糊匹配，从实现中取。
		Assert.assertEquals("FOO BAR", XXZ0.FOO_BAR.getValue(Locale.CANADA_FRENCH));// 其它语言，调用getValue方法取值。
		Assert.assertEquals("FOO BAR", XXZ0.FOO_BAR.getValue(Locale.FRENCH));// 其它语言，调用getValue方法取值。

		// 该类实现了接口IEnum_zh_CN
		// 该枚举类重写了getValue()方法
		Assert.assertEquals("张三和李四", XGZ0.FOO_BAR.getValue(null));// 等效于Locale.SIMPLIFIED_CHINESE。// 接口精确匹配，从实现中取。
		Assert.assertEquals("张三和李四", XGZ0.FOO_BAR.getValue(Locale.SIMPLIFIED_CHINESE));// 接口精确匹配，从实现中取。
		Assert.assertEquals("张三和李四", XGZ0.FOO_BAR.getValue(Locale.CHINESE));// 接口模糊匹配，从实现中取。
		Assert.assertEquals("FOO AND BAR", XGZ0.FOO_BAR.getValue(Locale.CANADA_FRENCH));// 其它语言，调用getValue方法取值。
		Assert.assertEquals("FOO AND BAR", XGZ0.FOO_BAR.getValue(Locale.FRENCH));// 其它语言，调用getValue方法取值。
	}

	// 有精确配置的国际化文件，将从配置文件中取值。
	@Test
	public void test21() {
		Assert.assertEquals("zh_CN中的张三和李四", XXX1.FOO_BAR.getValue(null));// 等效于Locale.SIMPLIFIED_CHINESE。// 文件精确匹配，从文件中取。
		Assert.assertEquals("zh_CN中的张三和李四", XXX1.FOO_BAR.getValue(Locale.SIMPLIFIED_CHINESE));// 文件精确匹配，从文件中取。
		Assert.assertEquals("zh_CN中的张三和李四", XXX1.FOO_BAR.getValue(Locale.CHINESE));// 中文可向下模糊匹配zh_CN，从文件中取。
		Assert.assertEquals("fr_CA中的张三和李四", XXX1.FOO_BAR.getValue(Locale.CANADA_FRENCH));// 文件精确匹配，从文件中取。
		Assert.assertEquals("FOO BAR", XXX1.FOO_BAR.getValue(Locale.FRENCH));// 其它语言不向下模糊匹配，调用getValue方法取值。

		// 该枚举类重写了getValue()方法
		Assert.assertEquals("zh_CN中的张三和李四", XGX1.FOO_BAR.getValue(null));// 等效于Locale.SIMPLIFIED_CHINESE。// 文件精确匹配，从文件中取。
		Assert.assertEquals("zh_CN中的张三和李四", XGX1.FOO_BAR.getValue(Locale.SIMPLIFIED_CHINESE));// 文件精确匹配，从文件中取。
		Assert.assertEquals("zh_CN中的张三和李四", XGX1.FOO_BAR.getValue(Locale.CHINESE));// 中文可向下模糊匹配zh_CN，从文件中取。
		Assert.assertEquals("fr_CA中的张三和李四", XGX1.FOO_BAR.getValue(Locale.CANADA_FRENCH));// 文件精确匹配，从文件中取。
		Assert.assertEquals("FOO AND BAR", XGX1.FOO_BAR.getValue(Locale.FRENCH));// 其它语言不向下模糊匹配，调用getValue方法取值。

		// 该类实现了接口IEnum_zh_CN；精确匹配zh_CN的情况下，将直接从类中取值；
		Assert.assertEquals("张三和李四", XXZ1.FOO_BAR.getValue(null));// 等效于Locale.SIMPLIFIED_CHINESE。// 接口精确匹配，从实现中取。
		Assert.assertEquals("张三和李四", XXZ1.FOO_BAR.getValue(Locale.SIMPLIFIED_CHINESE));// 接口精确匹配，从实现中取。
		Assert.assertEquals("zh_CN中的张三和李四", XXZ1.FOO_BAR.getValue(Locale.CHINESE));// 中文可向下模糊匹配zh_CN，从文件中取。
		Assert.assertEquals("fr_CA中的张三和李四", XXZ1.FOO_BAR.getValue(Locale.CANADA_FRENCH));// 文件精确匹配，从文件中取。
		Assert.assertEquals("FOO BAR", XXZ1.FOO_BAR.getValue(Locale.FRENCH));// 其它语言不向下模糊匹配，调用getValue方法取值。

		// 该类实现了接口IEnum_zh_CN；精确匹配zh_CN的情况下，将直接从类中取值；
		// 该枚举类重写了getValue()方法
		Assert.assertEquals("张三和李四", XGZ1.FOO_BAR.getValue(null));// 等效于Locale.SIMPLIFIED_CHINESE。// 接口精确匹配，从实现中取。
		Assert.assertEquals("张三和李四", XGZ1.FOO_BAR.getValue(Locale.SIMPLIFIED_CHINESE));// 接口精确匹配，从实现中取。
		Assert.assertEquals("zh_CN中的张三和李四", XGZ1.FOO_BAR.getValue(Locale.CHINESE));// 中文可向下模糊匹配zh_CN，从文件中取。
		Assert.assertEquals("fr_CA中的张三和李四", XGZ1.FOO_BAR.getValue(Locale.CANADA_FRENCH));// 文件精确匹配，从文件中取。
		Assert.assertEquals("FOO AND BAR", XGZ1.FOO_BAR.getValue(Locale.FRENCH));// 其它语言不向下模糊匹配，调用getValue方法取值。
	}

	// 无精确配置的国际化文件，有模糊配置的国际化文件，将从配置文件中取值。
	@Test
	public void test22() {
		Assert.assertEquals("zh中的张三和李四", XXX2.FOO_BAR.getValue(null));// 等效于Locale.SIMPLIFIED_CHINESE。// 向上模糊匹配，从文件中取。
		Assert.assertEquals("zh中的张三和李四", XXX2.FOO_BAR.getValue(Locale.SIMPLIFIED_CHINESE));// 向上模糊匹配，从文件中取。
		Assert.assertEquals("zh中的张三和李四", XXX2.FOO_BAR.getValue(Locale.CHINESE));// 文件精确匹配，从文件中取。
		Assert.assertEquals("fr中的张三和李四", XXX2.FOO_BAR.getValue(Locale.CANADA_FRENCH));// 向上模糊匹配，从文件中取。
		Assert.assertEquals("fr中的张三和李四", XXX2.FOO_BAR.getValue(Locale.FRENCH));// 文件精确匹配，从文件中取。

		// 该枚举类重写了getValue()方法
		Assert.assertEquals("zh中的张三和李四", XGX2.FOO_BAR.getValue(null));// 等效于Locale.SIMPLIFIED_CHINESE。// 向上模糊匹配，从文件中取。
		Assert.assertEquals("zh中的张三和李四", XGX2.FOO_BAR.getValue(Locale.SIMPLIFIED_CHINESE));// 向上模糊匹配，从文件中取。
		Assert.assertEquals("zh中的张三和李四", XGX2.FOO_BAR.getValue(Locale.CHINESE));// 文件精确匹配，从文件中取。
		Assert.assertEquals("fr中的张三和李四", XGX2.FOO_BAR.getValue(Locale.CANADA_FRENCH));// 向上模糊匹配，从文件中取。
		Assert.assertEquals("fr中的张三和李四", XGX2.FOO_BAR.getValue(Locale.FRENCH));// 文件精确匹配，从文件中取。

		// 该类实现了接口IEnum_zh
		Assert.assertEquals("张三和李四", XXZ2.FOO_BAR.getValue(null));// 等效于Locale.SIMPLIFIED_CHINESE。// 接口精确匹配，从实现中取。
		Assert.assertEquals("张三和李四", XXZ2.FOO_BAR.getValue(Locale.SIMPLIFIED_CHINESE));// 接口精确匹配，从实现中取。
		Assert.assertEquals("zh中的张三和李四", XXZ2.FOO_BAR.getValue(Locale.CHINESE));// 文件精确匹配，从文件中取。
		Assert.assertEquals("fr中的张三和李四", XXZ2.FOO_BAR.getValue(Locale.CANADA_FRENCH));// 向上模糊匹配，从文件中取。
		Assert.assertEquals("fr中的张三和李四", XXZ2.FOO_BAR.getValue(Locale.FRENCH));// 文件精确匹配，从文件中取。

		// 该类实现了接口IEnum_zh
		// 该枚举类重写了getValue()方法
		Assert.assertEquals("张三和李四", XGZ2.FOO_BAR.getValue(null));// 等效于Locale.SIMPLIFIED_CHINESE。// 接口精确匹配，从实现中取。
		Assert.assertEquals("张三和李四", XGZ2.FOO_BAR.getValue(Locale.SIMPLIFIED_CHINESE));// 接口精确匹配，从实现中取。
		Assert.assertEquals("zh中的张三和李四", XGZ2.FOO_BAR.getValue(Locale.CHINESE));// 文件精确匹配，从文件中取。
		Assert.assertEquals("fr中的张三和李四", XGZ2.FOO_BAR.getValue(Locale.CANADA_FRENCH));// 向上模糊匹配，从文件中取。
		Assert.assertEquals("fr中的张三和李四", XGZ2.FOO_BAR.getValue(Locale.FRENCH));// 文件精确匹配，从文件中取。
	}

}
